// 导入模块
import Request from 'luch-request'
import { useUserStore } from '@/stores/user'

// 实例化网络请求
const request = new Request({
	// 接口基地址
	baseURL: 'https://consult-api.itheima.net',
	// 设置一个自定义的参数
	custom: {
		info: '么么哒', // 设置通用参数，不修改用默认值，修改了 用修改之后的值
		showLoading: true, // 是否显示弹框
	},
})

// 黑名单
const blackUrls = ['/login', '/code', '/login/password']
// 请求拦截器
request.interceptors.request.use(
	(config) => {
		console.log('config:', config)
		// 通过 pinia 获取 token
		// 有 token 就携带
		const store = useUserStore()
		// 有 token 并且不在黑名单中，就需要携带
		if (store.token && blackUrls.includes(config.url!) === false) {
			config.header!['authorization'] = `Bearer ${store.token}`
		}
		if (config.custom?.showLoading) {
			uni.showLoading({
				title: '加载中',
			})
		}

		// 添加 token
		return config
	},
	(error) => {
		return Promise.reject(error)
	}
)

// 响应拦截器
request.interceptors.response.use(
	(res) => {
		uni.hideLoading()
		// 成功触发
		// 统一错误处理 业务状态码(http 状态码还是成功的，不会进到 错误的拦截器中)
		if (res.data.code !== 10000) {
			uni.showToast({
				title: res.data.message,
				icon: 'none',
			})
			// reject 静态方法，返回了一个失败状态的Promise 对象
			return Promise.reject(res.data)
		}
		// 简化数据返回
		return res.data?.data
	},
	(error) => {
		uni.hideLoading()
		// 异常触发，http 状态码 不是 (200-299)
		if (error.data.code === 401) {
			uni.showToast({
				title: error.data.message,
				icon: 'none',
			})
			// 删除 token
			const store = useUserStore()
			store.token = ''
			// 去登录页
			uni.redirectTo({
				url: '/pages/login/login',
			})
		}
		return Promise.reject(error)
	}
)

// 导出配置好的模网络模块
export { request }
